/**
 * 
 */
package com.nari.baseinfo.service;

import java.util.List;
import java.util.Map;

import com.nari.baseinfo.model.IHeatRoom;
import com.nari.coreframe.service.IGenericService;
import com.nari.platform.components.dhtmltree.DhtmlTreeNode;
import com.nari.platform.model.PageCond;
import com.nari.platform.model.ResponseMsg;
import com.nari.platform.model.ResultWithPageCond;

/**
 * 
 * @author Xiaopeng
 * @date 2013-8-1
 */
public interface IHeatRoomService extends IGenericService<IHeatRoom, String> {

	/**
	 * 分页查询热用户列表
	 * @param houseNo 门牌号(可选)
	 * @param roomOwner 户主姓名(可选)
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-26
	 */
	public ResultWithPageCond<IHeatRoom> queryHeatRoomPage(String houseNo,
			String roomOwner, String projectUID, String communityUID,
			PageCond pageCond) throws Exception;

	/**
	 * 通过热用户列表查询与之关联的小区ID-小区名称映射表
	 * @param projectList 热用户列表，若列表为空，则返回空的映射表
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-6
	 */
	public Map<String, String> queryReferCommunitysByRoomList(List<IHeatRoom> roomList) 
			throws Exception;

	/**
	 * 通过热用户列表查询与之关联的楼栋ID-楼栋名称映射表
	 * @param projectList 热用户列表，若列表为空，则返回空的映射表
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-6
	 */
	public Map<String, String> queryReferBuildingsByRoomList(List<IHeatRoom> roomList) 
			throws Exception;

	/**
	 * 通过热用户列表查询与之关联的楼栋单元ID-楼栋单元名称映射表
	 * @param projectList 热用户列表，若列表为空，则返回空的映射表
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-6
	 */
	public Map<String, String> queryReferBuildingUnitsByRoomList(List<IHeatRoom> roomList) 
			throws Exception;

	/**
	 * 通过热用户所属关系(所属项目、所属楼栋、所属分摊域)查询热用户列表 若项目ID、
	 * 楼栋ID、分摊域ID均不存在，则返回空列表
	 * @param projectUID 项目ID(可选)
	 * @param communityUID 所属小区(可选)
	 * @param shareAreaUID 分摊域ID(可选)
	 * @param buildingUID 楼栋ID(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-19
	 */
	public List<IHeatRoom> queryHeatRoomsByBelongs(String projectUID,
			String communityUID, String shareAreaUID, String buildingUID) throws Exception;
	
	/**
	 * 通过热用户所属关系(所属项目、所属楼栋、所属分摊域)查询热用户列表
	 * 若项目ID、楼栋ID、分摊域ID均不存在，则返回空列表
	 * @param projectUID 项目ID(可选)
	 * @param communityUID 所属小区(可选)
	 * @param shareAreaUID 分摊域ID(可选)
	 * @param buildingUID 楼栋ID(可选)
	 * @param ifMeasureCharge 是否参与分摊(可选)
	 * 1:不参与		2:参与
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-30
	 */
	public List<IHeatRoom> queryHeatRoomsByBelongs(String projectUID, String communityUID,
			String shareAreaUID, String buildingUID, Integer ifMeasureCharge) throws Exception;

	/**
	 * 通过热用户ID列表查询热用户信息
	 * @param idList 热用户ID列表，若ID列表为空，则返回空
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-13
	 */
	public List<IHeatRoom> queryHeatRoomsByIDList(List<String> idList) throws Exception;

	/**
	 * 通过分摊域等信息分页查询热用户列表
	 * @param shareAreaUID 所属分摊域(必选)
	 * 说明：若分摊域ID不存在，则返回零结果集
	 * @param houseNo 热用户门牌号(可选)
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param pageCond
	 * @return
	 * @author Xiaopeng
	 * @date 2013-8-21
	 */
	public ResultWithPageCond<IHeatRoom> queryHeatRoomPageByAreaUID(String shareAreaUID, 
			String houseNo, String projectUID, String communityUID, String buildingUID, 
			PageCond pageCond) throws Exception;
	
	/**
	 * 查询不隶属于某个分摊域下的热用户列表
	 * @param shareAreaUID 所属分摊域(必选)
	 * 说明：若分摊域ID不存在，则返回零结果集
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param houseNo 热用户门牌号(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-3
	 */
	public ResultWithPageCond<IHeatRoom> queryRoomPageExceptAreaUID(String shareAreaUID, 
			String projectUID, String communityUID, String buildingUID,String houseNo, 
			PageCond pageCond) throws Exception;

	/**
	 * 批量设置热用户所属分摊域信息
	 * @param shareAreaUID 所属分摊域
	 * @param roomIDList 热用户ID列表，格式：XXX,XXX,XXX
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-3
	 */
	public ResponseMsg saveHeatRoomArea(String shareAreaUID, String roomIDList) throws Exception;
	
	/**
	 * 通过所属分摊域统计热用户数量
	 * @param shareAreaUID
	 * @param ifMeasureCharge
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-6
	 */
	public int countHeatRoomsByAreaUID(String shareAreaUID, Integer ifMeasureCharge) 
			throws Exception;
	
	/**
	 * 通过所属分摊域统计热用户建筑面积之和
	 * @param shareAreaUID
	 * @param ifMeasureCharge
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-6
	 */
	public double sumRoomStructAreaByAreaUID(String shareAreaUID, 
			Integer ifMeasureCharge) throws Exception;
	
	/**
	 * 通过所属分摊域统计热用户供热面积之和
	 * @param shareAreaUID
	 * @param ifMeasureCharge
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-6
	 */
	public double sumRoomHeatAreaByAreaUID(String shareAreaUID, 
			Integer ifMeasureCharge) throws Exception;
	
	/**
	 * 通过所属楼栋统计热用户供热面积之和
	 * @param buildingUID
	 * @param ifMeasureCharge
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-6
	 */
	public double sumRoomHeatAreaByBuildingUID(String buildingUID, 
			Integer ifMeasureCharge) throws Exception;
	
	/**
	 * 根据热用户所属关系统计热用户的个数
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param shareAreaUID 所属分摊域(可选)
	 * @param ifMeasureCharge 是否参与计量收费(可选)
	 * @return
	 * @author Xiaopeng
	 * @date 2013-10-21
	 */
	public int countRoomSumByBelongs(String projectUID, String communityUID, String buildingUID, 
			String shareAreaUID, Integer ifMeasureCharge) throws Exception;
	
	/**
	 * 根据热用户所属关系统计热用户的建筑面积之和
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param shareAreaUID 所属分摊域(可选)
	 * @param ifMeasureCharge 是否参与计量收费(可选)
	 * @return
	 * @author Xiaopeng
	 * @date 2013-10-21
	 */
	public double sumRoomStructAreaByBelongs(String projectUID, String communityUID, String buildingUID, 
			String shareAreaUID, Integer ifMeasureCharge) throws Exception;
	
	/**
	 * 根据分摊域所属信息查询对应的楼栋用户结构树
	 * 楼栋用户结构树：
	 * 楼栋1
	 *   |-----单元11
	 *   |       |--楼层11
	 *   |       |    |--热用户11
	 *   |       |    |--热用户12
	 *   |       |    |--....
	 *   |       |--楼层12
	 *   |       |    |--....
	 *   |     单元12
	 *   |       |--.........
	 * 楼栋2
	 *   |-----单元21
	 *   |       |--楼层21
	 *   |       |    |--热用户21
	 *   |       |    |--热用户22
	 *   |       |    |--....
	 *   |     单元22
	 *   |       |--.........
	 *   ....................
	 * @param shareAreaUID 所属分摊域
	 * @param parentArchitectUID 上级节点ID
	 * @param parentArchitectType 上级节点类型
	 * 说明：building:楼栋	unit:单元	floor:楼层	room:热用户	
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-12-20
	 */
	public DhtmlTreeNode queryRelatedRoomArchitect(String shareAreaUID, 
			String parentArchitectUID, String parentArchitectType) throws Exception;
	
	/**
	 * 设置热用户所属的分摊域
	 * @param shareAreaUID
	 * @param roomIDList
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-12-20
	 */
	public ResponseMsg saveAreaRoomArchitect(String shareAreaUID, String roomIDList) throws Exception;
	
	/**
	 * 根据热用户ID级联删除关联信息
	 * 包括：热用户、系统用户及角色、分配表、散热器、用户分摊账单
	 * 注意：热量表数据、分配表数据等表计数据具有不可恢复性，因此不能作为级联删除的对象
	 * @param roomUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-1-20
	 */
	public ResponseMsg deleteCascadeByRoomUID(String roomUID) throws Exception;
}
